'Tap-Code-Generator
'Arne Groh
'agroh@t-online.de
'2013-06-02

'Security Bits:
'1111 1111
'1100 1001
'1101 1110(8 Mhz Keramik ext)

$regfile = "m8def.dat"
$crystal = 8e6
$baud = 38400
$hwstack = 64                                               ' default use 32 for the hardware stack
$swstack = 40                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space


Const Rx_max = 2                                            'maximale Anzahl der Eingabezeichen
Const Pausen_faktor = 200                                   'so viele Millisekunden dauert die kuerzeste Pause
Const Codestring_length = 10 * Rx_max                       'maximal 9 Pausen pro Buchstabe + 1
Const Ontime = 30                                           'so viele Millisekunden zieht der Magnet an
Const Easterlength = 255                                    'damit die Adresse (I) noch in ein Byte passt


Dim I As Byte
Dim J As Byte
Dim Nummer As Byte
Dim Letter As String * 1
Dim Asci As Byte
Dim Codestring As String * Codestring_length

Dim Rx_byte As Byte
Dim Rx_string As String * Rx_max

Dim Knock_string_length As Byte
Dim Pause As Word


Dim Flags As Byte
Rx_received Alias Flags.0 : Reset Rx_received
Last4 Alias Flags.2 : Reset Last4

Ddrc.3 = 1 : Portc.3 = 0                                    'set outputpin for solenoid

'enable interrupt if data is received on uart
On Urxc Rx_in
Enable Urxc

Enable Interrupts


Print "mit <ENTER> wird aus dem Eeprom geklopft"






'**************** main **************

Do
If Rx_received = 1 Then

For I = 0 To Easterlength
   Codestring = ""
   Readeeprom Letter , I
   If Asc(letter) > 122 Or Asc(letter) < 32 Then Goto Weiter2
   If Asc(letter) = 107 Then Letter = "c"                   'k durch c ersetzen
   Print Left(letter , 1) ; " " ;                           'Asc(letter) ; " ";
   If Asc(letter) = 32 Then
      Codestring = Codestring + "4"                         'leerzeichen gibt eine 4-fache Pause (Wortende)
      Set Last4                                             'dies merken, damit beim naechsten letter KEINE 3 kommt
   Else
      If I > 0 And Last4 = 0 Then Codestring = Codestring + "3"       'normalerweise jeden neuen Buchstaben mit einer 3er-Pause einleiten
      Asci = Asc(letter) - 96                               'aus ASCII die Buchstabennummer (1-25) machen
      If Asci > 10 Then Decr Asci                           'ab dem "k" alles ascis um 1 nach unten verschieben - also "k" ingnorieren
      Decr Asci                                             '!! damit 5/5=0 ergibt und (5 mod 5)=5 ergibt !!
      Nummer = Asci / 5                                     'den ganzzahligen Anteil ermitteln
      For J = 1 To Nummer
         Codestring = Codestring + "1"                      'an den Zeilenteil rekursiv immer eine 1 anfuegen
      Next J
      Codestring = Codestring + "2"                         'zwischen Zeile und Spalte eine doppelte Pause einfuegen
      Nummer = Asci Mod 5                                   'den Rest ermitteln
      For J = 1 To Nummer
         Codestring = Codestring + "1"                      'an den Spaltenteil rekursiv immer eine 1 anfuegen
      Next J
      Reset Last4
   End If

   Print Codestring

   Knock_string_length = Len(codestring)
   Portc.3 = 1                                              'der erste Klopf
   Waitms Ontime
   Portc.3 = 0
   For J = 1 To Knock_string_length
      Letter = Mid(codestring , J , 1)
      Pause = Val(letter) * Pausen_faktor
      Waitms Pause                                          'die ermittelte Pause
      Portc.3 = 1                                           'der abschliessende Klopf
      Waitms Ontime
      Portc.3 = 0
   Next J
  Weiter2:
Next I
Reset Rx_received
End If

Loop

End



'**************** subs ***************



Rx_in:
Rx_byte = Inkey()
If Rx_byte <> 13 Then
   Rx_string = Rx_string + Chr(rx_byte)
Else
   Set Rx_received
End If
Return

'**************** Data *****************
Dta:
$eeprom
$eepromhex
Data "aaa bbb ccc ddd eee fff ggg hhh iii jjj lll mmm nnn ooo ppp qqq rrr sss ttt uuu vvv www xxx yyy zzz"
$data

End